package com.example.demo.controller;

import com.example.demo.common.AjaxResult;
import com.example.demo.common.AppVariable;
import com.example.demo.common.PasswordUtils;
import com.example.demo.common.UserSessionUtils;
import com.example.demo.entity.Userinfo;
import com.example.demo.entity.vo.UserinfoVO;
import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private ArticleService articleService;

    /**
     *  注册功能. 即数据库的添加操作.
     */
    @RequestMapping("/reg") //
    public AjaxResult register(Userinfo userinfo) {
        // 非空校验 和 参数有效性校验
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername()) ||
                !StringUtils.hasLength(userinfo.getPassword())) {
            // 以统一对象 AjaxResult 格式进行返回.
            return AjaxResult.fail(-1, "非法参数");
        }
        // 密码加盐处理
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        // 以统一对象 AjaxResult 格式进行返回.
        return AjaxResult.success(userService.register(userinfo));
    }


    /**
     *  登录功能
     */
    @RequestMapping("/login")
    public AjaxResult login(String username, String password, HttpServletRequest request) {
        // 1. 非空校验
        if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
            return AjaxResult.fail(-1, "非法请求");
        }
        // 2. 查询数据库
        Userinfo userinfo = userService.getUserByName(username);
        if (userinfo != null && userinfo.getId() > 0) {
            // 是有效的用户名, 接着判断密码是否正确
            if (PasswordUtils.check(password, userinfo.getPassword())) {
                // 密码正确 登录成功.
                // 拿到 session 对象.
                HttpSession session = request.getSession();
                // 将用户存储到 session 中, AppVariable.USER_SESSION_KEY 是一个全局变量
                session.setAttribute(AppVariable.USER_SESSION_KEY, userinfo);
                // 返回数据之前, 隐藏用户敏感信息(密码)
                userinfo.setPassword("");
                return AjaxResult.success(userinfo);
            }
        }
        // 走到这里 登陆失败(前端代码 data != null 才登录成功).
        return AjaxResult.success(0, null);
    }

    /**
     *  查询列表页的用户发表的文章数
     */
    @RequestMapping("/showinfo")
    public AjaxResult showInfo(HttpServletRequest request) {
        UserinfoVO userinfoVO = new UserinfoVO();
        // todo: 1. 从 session中得到当前登录用户.
        // [该功能会用很多次, 设计为公共方法, 放到 common 包中]
        Userinfo userinfo = UserSessionUtils.getUser(request);
        if (userinfo == null) {
            return AjaxResult.fail(-1, "非法请求");
        }
        // Spring 提供深拷贝的方式: 将 userinfo 中相同的字段拷贝到 userinfoVO.
        BeanUtils.copyProperties(userinfo, userinfoVO);
        // todo: 2. 得到用户发表的文章总数.
        userinfoVO.setArtCount(articleService.getArtCountBYUid(userinfo.getId()));
        return AjaxResult.success(userinfoVO);
    }


    /**
     *  注销(退出登录)功能: 将用户从session中清楚即可.
     */
    @RequestMapping("/logout")
    public AjaxResult logout(HttpSession session) {
        // 将用户从session中清楚即可
        session.removeAttribute(AppVariable.USER_SESSION_KEY);
        return AjaxResult.success(1);
    }

    /**
     *  7. 根据用户id查询列表页用户信息
     */
    @RequestMapping("/showuser")
    public AjaxResult getUserById(Integer id) {
        if (id == null || id <= 0) {
            return AjaxResult.fail(-1, "非法参数");
        }

        UserinfoVO userinfoVO = new UserinfoVO();
        Userinfo userinfo = userService.getUserById(id);
        if (userinfo == null || userinfo.getId() <= 0) {
            return AjaxResult.fail(-1, "非法参数");
        }
        // 隐藏敏感数据(密码)
        userinfo.setPassword("");
        // 深拷贝
        BeanUtils.copyProperties(userinfo, userinfoVO);
        // 得到阅读量
        userinfoVO.setArtCount(articleService.getArtCountBYUid(userinfo.getId()));
        return AjaxResult.success(userinfoVO);
    }

}
